import '../file_node.dart';
import 'fs_gateway.dart';
import 'path_resolver.dart';

/// [CreateService]：用于创建文件或文件夹的服务类。
///
/// 功能：
/// - 负责解析逻辑路径到真实路径；
/// - 检查目标是否已存在（避免覆盖）；
/// - 调用 [FileSystemGateway] 执行实际的创建操作；
/// - 创建完成后再次确认是否成功。
///
/// 架构说明：
/// - 与 `DeleteService` 保持一致的结构；
/// - 对外暴露统一的 [create] 方法；
/// - 内部依赖 [PathResolver] 和 [FileSystemGateway]，实现路径解析与文件系统交互。
///
/// 使用示例：
/// ```dart
/// final service = CreateService(
///   pathResolver: PathResolver(),
///   fs: FileSystemGateway(),
/// );
///
/// final success = await service.create(
///   '/projects/demo',
///   FileNode(name: 'new.dart'),
///   isFolder: false,
/// );
///
/// if (success) {
///   print('文件创建成功');
/// } else {
///   print('文件创建失败');
/// }
/// ```
class CreateService {
  /// 路径解析器：负责将逻辑路径转换为真实路径。
  final PathResolver pathResolver;

  /// 文件系统网关：封装底层文件操作。
  final FileSystemGateway fs;

  CreateService({required this.pathResolver, required this.fs});

  /// 创建文件或文件夹。
  ///
  /// - [logicalPath] 树状视图中的逻辑路径（例如 `/src/utils`）；
  /// - [node] 目标 [FileNode]（表示文件或文件夹）；
  /// - [isFolder] 是否为文件夹；
  ///
  /// 返回值：
  /// - `true`：创建成功；
  /// - `false`：失败（路径为空、已存在或抛出异常）。
  ///
  /// 内部流程：
  /// 1. 通过 [PathResolver] 将逻辑路径解析为真实路径；
  /// 2. 检查目标是否已存在（存在则返回 `false`，避免覆盖）；
  /// 3. 调用 [FileSystemGateway] 执行创建操作；
  /// 4. 创建完成后再次确认是否成功。
  Future<bool> create(
      String logicalPath,
      FileNode node, {
        required bool isFolder,
      }) async {
    try {
      // 1) 解析真实路径
      final realPath = pathResolver.resolve(logicalPath, node).trim();
      if (realPath.isEmpty) return false;

      // 2) 已存在则直接失败，避免覆盖
      final exists = isFolder
          ? await fs.existsDir(realPath)
          : await fs.existsFile(realPath);
      if (exists) return false;

      // 3) 执行创建并二次确认
      if (isFolder) {
        await fs.createDir(realPath, recursive: true);
        return await fs.existsDir(realPath);
      } else {
        await fs.createFile(realPath);
        return await fs.existsFile(realPath);
      }
    } catch (_) {
      return false;
    }
  }
}
